import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from pyecharts import options as opts
from pyecharts.charts import Map
mpl.rcParams["font.sans-serif"] = [u"SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
# 显示所有的列数
pd.set_option('display.max_columns',None)
# 显示所有的行数
pd.set_option('display.max_rows',None)
# 读取excel表格内容
data=pd.read_excel("hotPlaces.xls")

# 功能：对表格数据内容进行处理，便于分析   作者:王雅晴  日期: 2021/12/17
def process():
    # 1.将地址前面的地址：和后面的地图去掉
    data["adress"]=data["adress"].str[3:-2]
    #2.将districts保留到省份
    districts_list=data["districts"].str.split("·");
    for i in range(0,len(districts_list)):
        data.loc[i,"districts"]=districts_list[i][0];
    # 3.将star中的景区去掉
    star_list=[]
    for stars in data["star"]:
        if(stars!="无"):
            stars=stars[0:-2]
        star_list.append(stars);
    for i in range(0,len(star_list)):
        data.loc[i,"star"]=star_list[i]
    # 4.将score中的热度去掉，将数据类型装换为float，并保留一位小数
    data["score"]=data["score"].str[2:].astype(float)
    data["score"]= data["score"].apply(lambda x : round(x, 1))
    # 5.将qunarPrice中的价格前的¥和起去掉，并装换成float类型
    data["qunarPrice"]=data["qunarPrice"].str[1:-1].astype(float)
    #6.将数据先按照月销量排再按照评分排
    data.sort_values(['saleCount','score'],ascending = False)
    data.sort_values("qunarPrice",ascending = False).head()


# 将数据进行图形化分析  作者:王雅晴  日期: 2021/12/17
def analyse():
    #1.热门景区top500价格区间图
    datas=data.head(500)
    price_min=datas.qunarPrice.min();
    price_max=datas.qunarPrice.max();
    # price_cut将所有的Sec_price的值划分到相应的区间中
    price_cut=pd.cut(datas.qunarPrice,bins=(price_min,100,200,300,400,500,price_max))
    #统计各个区间价格的占比(value_counts()默认降序，sort=False按自然顺序排列
    price_count=price_cut.value_counts(sort=False);
    x=np.arange(0,6)
    y=price_count
    plt.figure(figsize=(16,12))
    plt.bar(x,y,color="r",alpha=0.5)
    plt.title("热门景区top500价格区间图",fontsize=20)
    plt.xticks(np.arange((len(price_count))),price_count.index,rotation=30,fontsize=14)
    plt.yticks(fontsize=14)
    plt.xlabel('价格')
    plt.ylabel('占比')
    precents=[str(round(i*100,2))+"%" for i in price_count/price_count.sum()]
    for x,y,z in zip(x,y,precents):
        plt.text(x-0.1,y+5,z,fontsize=20)
    plt.savefig("热门景区top500价格区间图.png")
    plt.grid()
    #2.5A景区、4A景区、3A景区、无（饼状图）
    plt.figure(figsize=(16,12))
    star_value=data.star.value_counts()
    plt.pie(star_value,labels=['无','4A','5A','3A'],explode=(0, 0, 0.2, 0),colors=['#9999ff','#ff9999','#7777aa','#FF0000',''] ,autopct='%.2f%%',textprops = {'fontsize':30,'color':'k'})
    plt.title("景区等级分布图",fontsize=30)
    plt.savefig("景区等级分布图.png")
    #3.海南和云南月销量top10价格对比折线图
    hainan=data[data.districts=="海南"].head(10)
    yunnan=data[data.districts=="云南"].head(10)
    hainan.index=range(1,11)
    yunnan.index=range(1,11)
    plt.figure(figsize=(16,12))
    plt.plot(np.arange(1,11),hainan.qunarPrice,marker ='o',c="r",label="海南")
    plt.plot(np.arange(1,11),yunnan.qunarPrice,marker ='o',c="g",label="云南")
    plt.xticks(np.arange(1,11))
    plt.xlabel('月销量排名')
    plt.ylabel('价格')
    hainan_copy=hainan.qunarPrice
    yunnan_copy=yunnan.qunarPrice
    top1=hainan_copy.sort_values(ascending=False)[1]
    top2=yunnan_copy.sort_values(ascending=False)[2]
    # 标注两个城市中价格最高的地方
    plt.scatter(1, top1, 50, color='r')
    plt.annotate("亚特兰蒂斯水世界", xy=(1, top1), textcoords="offset points", xytext=(40, 40),
                 arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.5"))
    plt.scatter(2, top2, 50, color='g')
    plt.annotate("七彩云南欢乐世界", xy=(2, top2), textcoords="offset points", xytext=(30, 30),
                 arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.5"))
    plt.savefig("价格对比折线图.png")
    #4.价格和销售量,地区（北京,黑龙江,广州）的关系（散点图）
    plt.figure(figsize=(20,12))
    axes = plt.subplot(111)
    type1 = axes.scatter(data[data.districts=="北京"].qunarPrice, data[data.districts=="北京"].saleCount, s=20, c='red')
    type2 = axes.scatter(data[data.districts=="广东"].qunarPrice, data[data.districts=="广东"].saleCount,s=40, c='green')
    type3 = axes.scatter(data[data.districts=="黑龙江"].qunarPrice, data[data.districts=="黑龙江"].saleCount, s=50, c='blue')
    axes.legend((type1, type2, type3), (u'北京', u'广东', u'黑龙江'), loc=2)
    plt.xlabel("价格")
    plt.ylabel("月销售量")
    plt.savefig("散点图.png")
    #5.景点地区分布图
    locations=[location for location in data["districts"].value_counts().items()]#以列表包围元组的形式输出
    map=(
        Map()
        .add("景区数量",
             [list(location) for location in locations],"china")
        .set_global_opts(
            title_opts=opts.TitleOpts(title="地址分布图"),
            visualmap_opts=opts.VisualMapOpts(max_=300)
    )
    )
    map.render(path="地址分布图.html")
    map.render_notebook()
    #6.获取各个地区景区价格平均值
    datas=data.groupby(by="districts")
    list_districts=[]
    for key,value in datas:
        list_districts.append(key)
    print(data.groupby(by="districts").qunarPrice.mean())
    plt.figure(figsize=(16,12))
    plt.bar(list_districts,data.groupby(by="districts").qunarPrice.mean(),color="r",alpha=0.5)
    plt.xlabel("地区")
    plt.ylabel("平均价格")
    plt.savefig("平均价格分布图.png")
    plt.show()
if __name__ == '__main__':
    process()
    analyse()
    #将改变后的数据填入新的表格
    data.to_excel("hotPlaces_new.xlsx",index=False)
